moduleNamespace.js 1.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354
  1. "use strict";
  2. Object.defineProperty(exports, "__esModule", {
  3. value: true
  4. });
  5. exports.moduleNamespace = moduleNamespace;
  6. /**
  7. * Returns the namespace of an imported module or `null` if the namespace is removed.
  8. *
  9. * Example: no import found, possibly using global function
  10. * `@use "sass:color";`
  11. * `moduleNamespace(root, 'sass:map')` returns 'map'
  12. *
  13. * Example: default namespace
  14. * `@use "sass:map";`
  15. * `moduleNamespace(root, 'sass:map')` returns `map`
  16. *
  17. * Example: custom namespace
  18. * `@use "sass:map" as ns;`
  19. * `moduleNamespace(root, 'sass:map')` returns 'ns'
  20. *
  21. * Example: no namespace
  22. * `@use "sass:map" as *;`
  23. * `moduleNamespace(root, 'sass:map')` returns `null`
  24. *
  25. * Have a look at the tests for more examples.
  26. */
  27. function moduleNamespace(root, module) {
  28. var moduleNamespace = getDefaultNamespace(module);
  29. root.walkAtRules("use", function (rule) {
  30. var customNamespace = getCustomNamespace(module, rule);
  31. switch (customNamespace) {
  32. case null:
  33. return;
  34. case "*":
  35. moduleNamespace = null;
  36. return;
  37. default:
  38. moduleNamespace = customNamespace;
  39. }
  40. });
  41. return moduleNamespace;
  42. }
  43. function getDefaultNamespace(module) {
  44. return module.match(/([^/:]+)$/)[1].replace(/\.[^.]+$/, "");
  45. }
  46. function getCustomNamespace(module, rule) {
  47. var ruleParamsParts = rule.params.split(new RegExp("[\"']".concat(module, "['\"][ \n]*as")));
  48. if (ruleParamsParts.length < 2) {
  49. return null;
  50. }
  51. var secondRuleParamsPart = ruleParamsParts[1].trim();
  52. return !secondRuleParamsPart.startsWith("*") ? secondRuleParamsPart.split(" ")[0] : "*";
  53. }