ImportParserPlugin.js 3.3 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182
  1. /*
  2. MIT License http://www.opensource.org/licenses/mit-license.php
  3. Author Tobias Koppers @sokra
  4. */
  5. "use strict";
  6. const ImportEagerContextDependency = require("./ImportEagerContextDependency");
  7. const ImportLazyOnceContextDependency = require("./ImportLazyOnceContextDependency");
  8. const ImportLazyContextDependency = require("./ImportLazyContextDependency");
  9. const ImportDependenciesBlock = require("./ImportDependenciesBlock");
  10. const ImportEagerDependency = require("./ImportEagerDependency");
  11. const ContextDependencyHelpers = require("./ContextDependencyHelpers");
  12. const UnsupportedFeatureWarning = require("../UnsupportedFeatureWarning");
  13. class ImportParserPlugin {
  14. constructor(options) {
  15. this.options = options;
  16. }
  17. apply(parser) {
  18. const options = this.options;
  19. parser.plugin(["call System.import", "import-call"], (expr) => {
  20. if(expr.arguments.length !== 1)
  21. throw new Error("Incorrect number of arguments provided to 'import(module: string) -> Promise'.");
  22. const param = parser.evaluateExpression(expr.arguments[0]);
  23. let chunkName = null;
  24. let mode = "lazy";
  25. const importOptions = parser.getCommentOptions(expr.range);
  26. if(importOptions) {
  27. if(typeof importOptions.webpackChunkName !== "undefined") {
  28. if(typeof importOptions.webpackChunkName !== "string")
  29. parser.state.module.warnings.push(new UnsupportedFeatureWarning(parser.state.module, `\`webpackChunkName\` expected a string, but received: ${importOptions.webpackChunkName}.`));
  30. else
  31. chunkName = importOptions.webpackChunkName;
  32. }
  33. if(typeof importOptions.webpackMode !== "undefined") {
  34. if(typeof importOptions.webpackMode !== "string")
  35. parser.state.module.warnings.push(new UnsupportedFeatureWarning(parser.state.module, `\`webpackMode\` expected a string, but received: ${importOptions.webpackMode}.`));
  36. else
  37. mode = importOptions.webpackMode;
  38. }
  39. }
  40. if(param.isString()) {
  41. if(mode !== "lazy" && mode !== "eager") {
  42. parser.state.module.warnings.push(new UnsupportedFeatureWarning(parser.state.module, `\`webpackMode\` expected 'lazy' or 'eager', but received: ${mode}.`));
  43. }
  44. if(mode === "eager") {
  45. const dep = new ImportEagerDependency(param.string, expr.range);
  46. parser.state.current.addDependency(dep);
  47. } else {
  48. const depBlock = new ImportDependenciesBlock(param.string, expr.range, chunkName, parser.state.module, expr.loc);
  49. parser.state.current.addBlock(depBlock);
  50. }
  51. return true;
  52. } else {
  53. if(mode !== "lazy" && mode !== "lazy-once" && mode !== "eager") {
  54. parser.state.module.warnings.push(new UnsupportedFeatureWarning(parser.state.module, `\`webpackMode\` expected 'lazy', 'lazy-once' or 'eager', but received: ${mode}.`));
  55. }
  56. let Dep = ImportLazyContextDependency;
  57. if(mode === "eager") {
  58. Dep = ImportEagerContextDependency;
  59. } else if(mode === "lazy-once") {
  60. Dep = ImportLazyOnceContextDependency;
  61. }
  62. const dep = ContextDependencyHelpers.create(Dep, expr.range, param, expr, options, chunkName);
  63. if(!dep) return;
  64. dep.loc = expr.loc;
  65. dep.optional = !!parser.scope.inTry;
  66. parser.state.current.addDependency(dep);
  67. return true;
  68. }
  69. });
  70. }
  71. }
  72. module.exports = ImportParserPlugin;