@stylable/core
Version:
CSS for Components
84 lines • 2.95 kB
JavaScript
;
var __importDefault = (this && this.__importDefault) || function (mod) {
return (mod && mod.__esModule) ? mod : { "default": mod };
};
Object.defineProperty(exports, "__esModule", { value: true });
exports.fixRelativeUrls = exports.processDeclarationUrls = exports.makeAbsolute = exports.isAsset = exports.isExternal = exports.collectAssets = void 0;
const path_1 = __importDefault(require("path"));
const url_regex_1 = __importDefault(require("url-regex"));
const { parseValues, stringifyValues } = require('css-selector-tokenizer');
const isUrl = url_regex_1.default({ exact: true, strict: true });
function collectAssets(ast) {
const assetDependencies = [];
const onUrl = (node) => {
assetDependencies.push(node.url);
};
ast.walkDecls((decl) => processDeclarationUrls(decl, onUrl, false));
return assetDependencies;
}
exports.collectAssets = collectAssets;
function isExternal(url) {
return url === '' || url.startsWith('data:') || isUrl.test(url);
}
exports.isExternal = isExternal;
function isAsset(url) {
return !isExternal(url);
}
exports.isAsset = isAsset;
function makeAbsolute(resourcePath, rootContext, moduleContext) {
const isAbs = path_1.default.isAbsolute(resourcePath);
let abs;
if (isExternal(resourcePath)) {
abs = resourcePath;
}
else if (isAbs && resourcePath.startsWith('/')) {
abs = path_1.default.join(rootContext, resourcePath);
}
else if (isAbs) {
abs = resourcePath;
}
else {
abs = path_1.default.join(moduleContext, resourcePath);
}
return abs;
}
exports.makeAbsolute = makeAbsolute;
function processDeclarationUrls(decl, onUrl, transform) {
const ast = parseValues(decl.value);
ast.nodes.forEach((node) => {
node.nodes.forEach((node) => findUrls(node, onUrl));
});
if (transform) {
decl.value = stringifyValues(ast);
}
}
exports.processDeclarationUrls = processDeclarationUrls;
function findUrls(node, onUrl) {
const { type, nodes = [] } = node;
switch (type) {
case 'value':
nodes.forEach((_) => findUrls(_, onUrl));
break;
case 'nested-item':
nodes.forEach((_) => findUrls(_, onUrl));
break;
case 'url':
onUrl(node);
break;
}
}
function fixRelativeUrls(ast, originPath, targetPath) {
ast.walkDecls((decl) => processDeclarationUrls(decl, (node) => {
if (isAsset(node.url)) {
if (node.url.startsWith('.')) {
node.url =
'./' +
path_1.default
.join(path_1.default.relative(path_1.default.dirname(targetPath), path_1.default.dirname(originPath)), node.url)
.replace(/\\/gm, '/');
}
}
}, true));
}
exports.fixRelativeUrls = fixRelativeUrls;
//# sourceMappingURL=stylable-assets.js.map