NodeSourcePlugin.js 3.1 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586
  1. /*
  2. MIT License http://www.opensource.org/licenses/mit-license.php
  3. Author Tobias Koppers @sokra
  4. */
  5. "use strict";
  6. const AliasPlugin = require("enhanced-resolve/lib/AliasPlugin");
  7. const ParserHelpers = require("../ParserHelpers");
  8. const nodeLibsBrowser = require("node-libs-browser");
  9. module.exports = class NodeSourcePlugin {
  10. constructor(options) {
  11. this.options = options;
  12. }
  13. apply(compiler) {
  14. const options = this.options;
  15. function getPathToModule(module, type) {
  16. if(type === true || (type === undefined && nodeLibsBrowser[module])) {
  17. if(!nodeLibsBrowser[module]) throw new Error(`No browser version for node.js core module ${module} available`);
  18. return nodeLibsBrowser[module];
  19. } else if(type === "mock") {
  20. return require.resolve(`node-libs-browser/mock/${module}`);
  21. } else if(type === "empty") {
  22. return require.resolve("node-libs-browser/mock/empty");
  23. } else return module;
  24. }
  25. function addExpression(parser, name, module, type, suffix) {
  26. suffix = suffix || "";
  27. parser.plugin(`expression ${name}`, function() {
  28. if(this.state.module && this.state.module.resource === getPathToModule(module, type)) return;
  29. const mockModule = ParserHelpers.requireFileAsExpression(this.state.module.context, getPathToModule(module, type));
  30. return ParserHelpers.addParsedVariableToModule(this, name, mockModule + suffix);
  31. });
  32. }
  33. compiler.plugin("compilation", function(compilation, params) {
  34. params.normalModuleFactory.plugin("parser", function(parser, parserOptions) {
  35. if(parserOptions.node === false)
  36. return;
  37. let localOptions = options;
  38. if(parserOptions.node)
  39. localOptions = Object.assign({}, localOptions, parserOptions.node);
  40. if(localOptions.global) {
  41. parser.plugin("expression global", function() {
  42. const retrieveGlobalModule = ParserHelpers.requireFileAsExpression(this.state.module.context, require.resolve("../../buildin/global.js"));
  43. return ParserHelpers.addParsedVariableToModule(this, "global", retrieveGlobalModule);
  44. });
  45. }
  46. if(localOptions.process) {
  47. const processType = localOptions.process;
  48. addExpression(parser, "process", "process", processType);
  49. }
  50. if(localOptions.console) {
  51. const consoleType = localOptions.console;
  52. addExpression(parser, "console", "console", consoleType);
  53. }
  54. const bufferType = localOptions.Buffer;
  55. if(bufferType) {
  56. addExpression(parser, "Buffer", "buffer", bufferType, ".Buffer");
  57. }
  58. if(localOptions.setImmediate) {
  59. const setImmediateType = localOptions.setImmediate;
  60. addExpression(parser, "setImmediate", "timers", setImmediateType, ".setImmediate");
  61. addExpression(parser, "clearImmediate", "timers", setImmediateType, ".clearImmediate");
  62. }
  63. });
  64. });
  65. compiler.plugin("after-resolvers", (compiler) => {
  66. Object.keys(nodeLibsBrowser).forEach((lib) => {
  67. if(options[lib] !== false) {
  68. compiler.resolvers.normal.apply(
  69. new AliasPlugin("described-resolve", {
  70. name: lib,
  71. onlyModule: true,
  72. alias: getPathToModule(lib, options[lib])
  73. }, "resolve")
  74. );
  75. }
  76. });
  77. });
  78. }
  79. };