UNPKG

@stylable/core

Version:

CSS for Components

84 lines 2.95 kB
"use strict"; 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