CommonJsPlugin.js 4.0 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788
  1. /*
  2. MIT License http://www.opensource.org/licenses/mit-license.php
  3. Author Tobias Koppers @sokra
  4. */
  5. "use strict";
  6. const ConstDependency = require("./ConstDependency");
  7. const CommonJsRequireDependency = require("./CommonJsRequireDependency");
  8. const CommonJsRequireContextDependency = require("./CommonJsRequireContextDependency");
  9. const RequireResolveDependency = require("./RequireResolveDependency");
  10. const RequireResolveContextDependency = require("./RequireResolveContextDependency");
  11. const RequireResolveHeaderDependency = require("./RequireResolveHeaderDependency");
  12. const RequireHeaderDependency = require("./RequireHeaderDependency");
  13. const NullFactory = require("../NullFactory");
  14. const RequireResolveDependencyParserPlugin = require("./RequireResolveDependencyParserPlugin");
  15. const CommonJsRequireDependencyParserPlugin = require("./CommonJsRequireDependencyParserPlugin");
  16. const ParserHelpers = require("../ParserHelpers");
  17. class CommonJsPlugin {
  18. constructor(options) {
  19. this.options = options;
  20. }
  21. apply(compiler) {
  22. const options = this.options;
  23. compiler.plugin("compilation", (compilation, params) => {
  24. const normalModuleFactory = params.normalModuleFactory;
  25. const contextModuleFactory = params.contextModuleFactory;
  26. compilation.dependencyFactories.set(CommonJsRequireDependency, normalModuleFactory);
  27. compilation.dependencyTemplates.set(CommonJsRequireDependency, new CommonJsRequireDependency.Template());
  28. compilation.dependencyFactories.set(CommonJsRequireContextDependency, contextModuleFactory);
  29. compilation.dependencyTemplates.set(CommonJsRequireContextDependency, new CommonJsRequireContextDependency.Template());
  30. compilation.dependencyFactories.set(RequireResolveDependency, normalModuleFactory);
  31. compilation.dependencyTemplates.set(RequireResolveDependency, new RequireResolveDependency.Template());
  32. compilation.dependencyFactories.set(RequireResolveContextDependency, contextModuleFactory);
  33. compilation.dependencyTemplates.set(RequireResolveContextDependency, new RequireResolveContextDependency.Template());
  34. compilation.dependencyFactories.set(RequireResolveHeaderDependency, new NullFactory());
  35. compilation.dependencyTemplates.set(RequireResolveHeaderDependency, new RequireResolveHeaderDependency.Template());
  36. compilation.dependencyFactories.set(RequireHeaderDependency, new NullFactory());
  37. compilation.dependencyTemplates.set(RequireHeaderDependency, new RequireHeaderDependency.Template());
  38. params.normalModuleFactory.plugin("parser", (parser, parserOptions) => {
  39. if(typeof parserOptions.commonjs !== "undefined" && !parserOptions.commonjs)
  40. return;
  41. const requireExpressions = ["require", "require.resolve", "require.resolveWeak"];
  42. for(let expression of requireExpressions) {
  43. parser.plugin(`typeof ${expression}`, ParserHelpers.toConstantDependency("function"));
  44. parser.plugin(`evaluate typeof ${expression}`, ParserHelpers.evaluateToString("function"));
  45. }
  46. parser.plugin("evaluate typeof module", ParserHelpers.evaluateToString("object"));
  47. parser.plugin("assign require", (expr) => {
  48. // to not leak to global "require", we need to define a local require here.
  49. const dep = new ConstDependency("var require;", 0);
  50. dep.loc = expr.loc;
  51. parser.state.current.addDependency(dep);
  52. parser.scope.definitions.push("require");
  53. return true;
  54. });
  55. parser.plugin("can-rename require", () => true);
  56. parser.plugin("rename require", (expr) => {
  57. // define the require variable. It's still undefined, but not "not defined".
  58. const dep = new ConstDependency("var require;", 0);
  59. dep.loc = expr.loc;
  60. parser.state.current.addDependency(dep);
  61. return false;
  62. });
  63. parser.plugin("typeof module", () => true);
  64. parser.plugin("evaluate typeof exports", ParserHelpers.evaluateToString("object"));
  65. parser.apply(
  66. new CommonJsRequireDependencyParserPlugin(options),
  67. new RequireResolveDependencyParserPlugin(options)
  68. );
  69. });
  70. });
  71. }
  72. }
  73. module.exports = CommonJsPlugin;