blob: 8ff04d7043173ec9b1ea4ca4b1c86168dcc593a1 [file] [log] [blame]
"use strict";
Object.defineProperty(exports, "__esModule", {
value: true
});
exports.moduleNamespace = moduleNamespace;
/**
* Returns the namespace of an imported module or `null` if the namespace is removed.
*
* Example: no import found, possibly using global function
* `@use "sass:color";`
* `moduleNamespace(root, 'sass:map')` returns 'map'
*
* Example: default namespace
* `@use "sass:map";`
* `moduleNamespace(root, 'sass:map')` returns `map`
*
* Example: custom namespace
* `@use "sass:map" as ns;`
* `moduleNamespace(root, 'sass:map')` returns 'ns'
*
* Example: no namespace
* `@use "sass:map" as *;`
* `moduleNamespace(root, 'sass:map')` returns `null`
*
* Have a look at the tests for more examples.
*/
function moduleNamespace(root, module) {
var moduleNamespace = getDefaultNamespace(module);
root.walkAtRules("use", function (rule) {
var customNamespace = getCustomNamespace(module, rule);
switch (customNamespace) {
case null:
return;
case "*":
moduleNamespace = null;
return;
default:
moduleNamespace = customNamespace;
}
});
return moduleNamespace;
}
function getDefaultNamespace(module) {
return module.match(/([^/:]+)$/)[1].replace(/\.[^.]+$/, "");
}
function getCustomNamespace(module, rule) {
var ruleParamsParts = rule.params.split(new RegExp("[\"']".concat(module, "['\"][ \n]*as")));
if (ruleParamsParts.length < 2) {
return null;
}
var secondRuleParamsPart = ruleParamsParts[1].trim();
return !secondRuleParamsPart.startsWith("*") ? secondRuleParamsPart.split(" ")[0] : "*";
}