HarmonyImportDependencyParserPlugin.js 4.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102
  1. /*
  2. MIT License http://www.opensource.org/licenses/mit-license.php
  3. Author Tobias Koppers @sokra
  4. */
  5. "use strict";
  6. const HarmonyImportDependency = require("./HarmonyImportDependency");
  7. const HarmonyImportSpecifierDependency = require("./HarmonyImportSpecifierDependency");
  8. const HarmonyAcceptImportDependency = require("./HarmonyAcceptImportDependency");
  9. const HarmonyAcceptDependency = require("./HarmonyAcceptDependency");
  10. const HarmonyModulesHelpers = require("./HarmonyModulesHelpers");
  11. module.exports = class HarmonyImportDependencyParserPlugin {
  12. constructor(moduleOptions) {
  13. this.strictExportPresence = moduleOptions.strictExportPresence;
  14. }
  15. apply(parser) {
  16. parser.plugin("import", (statement, source) => {
  17. const dep = new HarmonyImportDependency(source, HarmonyModulesHelpers.getNewModuleVar(parser.state, source), statement.range);
  18. dep.loc = statement.loc;
  19. parser.state.current.addDependency(dep);
  20. parser.state.lastHarmonyImport = dep;
  21. return true;
  22. });
  23. parser.plugin("import specifier", (statement, source, id, name) => {
  24. parser.scope.definitions.length--;
  25. parser.scope.renames[`$${name}`] = "imported var";
  26. if(!parser.state.harmonySpecifier) parser.state.harmonySpecifier = {};
  27. parser.state.harmonySpecifier[`$${name}`] = [parser.state.lastHarmonyImport, HarmonyModulesHelpers.getModuleVar(parser.state, source), id];
  28. return true;
  29. });
  30. parser.plugin("expression imported var", (expr) => {
  31. const name = expr.name;
  32. const settings = parser.state.harmonySpecifier[`$${name}`];
  33. const dep = new HarmonyImportSpecifierDependency(settings[0], settings[1], settings[2], name, expr.range, this.strictExportPresence);
  34. dep.shorthand = parser.scope.inShorthand;
  35. dep.directImport = true;
  36. dep.loc = expr.loc;
  37. parser.state.current.addDependency(dep);
  38. return true;
  39. });
  40. parser.plugin("expression imported var.*", (expr) => {
  41. const name = expr.object.name;
  42. const settings = parser.state.harmonySpecifier[`$${name}`];
  43. if(settings[2] !== null)
  44. return false;
  45. const dep = new HarmonyImportSpecifierDependency(settings[0], settings[1], expr.property.name || expr.property.value, name, expr.range, this.strictExportPresence);
  46. dep.shorthand = parser.scope.inShorthand;
  47. dep.directImport = false;
  48. dep.loc = expr.loc;
  49. parser.state.current.addDependency(dep);
  50. return true;
  51. });
  52. parser.plugin("call imported var", (expr) => {
  53. const args = expr.arguments;
  54. const fullExpr = expr;
  55. expr = expr.callee;
  56. const name = expr.name;
  57. const settings = parser.state.harmonySpecifier[`$${name}`];
  58. const dep = new HarmonyImportSpecifierDependency(settings[0], settings[1], settings[2], name, expr.range, this.strictExportPresence);
  59. dep.directImport = true;
  60. dep.callArgs = args;
  61. dep.call = fullExpr;
  62. dep.loc = expr.loc;
  63. parser.state.current.addDependency(dep);
  64. if(args)
  65. parser.walkExpressions(args);
  66. return true;
  67. });
  68. parser.plugin("hot accept callback", (expr, requests) => {
  69. const dependencies = requests
  70. .filter(request => HarmonyModulesHelpers.checkModuleVar(parser.state, request))
  71. .map(request => {
  72. const dep = new HarmonyAcceptImportDependency(request, HarmonyModulesHelpers.getModuleVar(parser.state, request), expr.range);
  73. dep.loc = expr.loc;
  74. parser.state.current.addDependency(dep);
  75. return dep;
  76. });
  77. if(dependencies.length > 0) {
  78. const dep = new HarmonyAcceptDependency(expr.range, dependencies, true);
  79. dep.loc = expr.loc;
  80. parser.state.current.addDependency(dep);
  81. }
  82. });
  83. parser.plugin("hot accept without callback", (expr, requests) => {
  84. const dependencies = requests
  85. .filter(request => HarmonyModulesHelpers.checkModuleVar(parser.state, request))
  86. .map(request => {
  87. const dep = new HarmonyAcceptImportDependency(request, HarmonyModulesHelpers.getModuleVar(parser.state, request), expr.range);
  88. dep.loc = expr.loc;
  89. parser.state.current.addDependency(dep);
  90. return dep;
  91. });
  92. if(dependencies.length > 0) {
  93. const dep = new HarmonyAcceptDependency(expr.range, dependencies, false);
  94. dep.loc = expr.loc;
  95. parser.state.current.addDependency(dep);
  96. }
  97. });
  98. }
  99. };