LocalModulesHelpers.js 1.7 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071
  1. /*
  2. MIT License http://www.opensource.org/licenses/mit-license.php
  3. Author Tobias Koppers @sokra
  4. */
  5. "use strict";
  6. const LocalModule = require("./LocalModule");
  7. /** @typedef {import("../javascript/JavascriptParser").JavascriptParserState} JavascriptParserState */
  8. /**
  9. * Returns resolved module.
  10. * @param {string} parent parent module
  11. * @param {string} mod module to resolve
  12. * @returns {string} resolved module
  13. */
  14. const lookup = (parent, mod) => {
  15. if (mod.charAt(0) !== ".") return mod;
  16. const path = parent.split("/");
  17. const segments = mod.split("/");
  18. path.pop();
  19. for (let i = 0; i < segments.length; i++) {
  20. const seg = segments[i];
  21. if (seg === "..") {
  22. path.pop();
  23. } else if (seg !== ".") {
  24. path.push(seg);
  25. }
  26. }
  27. return path.join("/");
  28. };
  29. /**
  30. * Returns local module.
  31. * @param {JavascriptParserState} state parser state
  32. * @param {string} name name
  33. * @returns {LocalModule} local module
  34. */
  35. module.exports.addLocalModule = (state, name) => {
  36. if (!state.localModules) {
  37. state.localModules = [];
  38. }
  39. const m = new LocalModule(name, state.localModules.length);
  40. state.localModules.push(m);
  41. return m;
  42. };
  43. /**
  44. * Returns local module or null.
  45. * @param {JavascriptParserState} state parser state
  46. * @param {string} name name
  47. * @param {string=} namedModule named module
  48. * @returns {LocalModule | null} local module or null
  49. */
  50. module.exports.getLocalModule = (state, name, namedModule) => {
  51. if (!state.localModules) return null;
  52. if (namedModule) {
  53. // resolve dependency name relative to the defining named module
  54. name = lookup(namedModule, name);
  55. }
  56. for (let i = 0; i < state.localModules.length; i++) {
  57. if (state.localModules[i].name === name) {
  58. return state.localModules[i];
  59. }
  60. }
  61. return null;
  62. };