siphon-cli
Version:
Simple bundler for web applications. 📦🔧🧡
206 lines (205 loc) • 11.1 kB
JavaScript
;
var __spreadArray = (this && this.__spreadArray) || function (to, from, pack) {
if (pack || arguments.length === 2) for (var i = 0, l = from.length, ar; i < l; i++) {
if (ar || !(i in from)) {
if (!ar) ar = Array.prototype.slice.call(from, 0, i);
ar[i] = from[i];
}
}
return to.concat(ar || Array.prototype.slice.call(from));
};
Object.defineProperty(exports, "__esModule", { value: true });
var fs_1 = require("fs");
var path_1 = require("path");
var types_1 = require("../../types");
var utils_1 = require("../../utils");
var palette_1 = require("../transpilers/palette");
var tagNameSearch_1 = require("../transpilers/mimo/tagNameSearch");
function resolveCSS(nodes, source, destination, options, assets) {
var _a, _b, _c, _d, _e, _f;
var trail = [];
function resolveCSSImports(AST, href) {
var _a;
var rule;
for (var i = 0; AST.rules[i]; i++) {
rule = AST.rules[i];
if (rule instanceof types_1.ImportRule &&
rule.resourceType === "local" &&
rule.href.endsWith(".css")) {
var index = AST.rules.indexOf(rule);
var subHref = (0, utils_1.relativePath)(href, rule.href);
if (!trail.includes(subHref) && (0, utils_1.fileExists)(subHref)) {
trail.push(subHref);
var subAST = palette_1.default.parse((0, fs_1.readFileSync)(subHref).toString());
var subASTRules = resolveCSSImports(subAST, subHref);
(_a = AST.rules).splice.apply(_a, __spreadArray([index, 1], subASTRules, false));
i += subASTRules.length - 1;
}
else if ((0, utils_1.fileExists)(subHref))
AST.rules.splice(index, 1);
}
else if (rule instanceof types_1.StyleRule) {
Object.entries(rule.notation).forEach(function (entry) {
if (entry[1].startsWith("url(") && entry[1].endsWith(")")) {
var asset = "";
if (/'|"/.test(entry[1][4]))
asset = (0, utils_1.relativePath)(href, entry[1].slice(5, -2));
else
asset = (0, utils_1.relativePath)(href, entry[1].slice(4, -1));
if (!asset.startsWith("https://") && !asset.startsWith("http://")) {
if (options.wickedMode && (0, utils_1.fileExists)(asset)) {
rule.notation[entry[0]] =
'url("' + (0, utils_1.stringifytoBase64)(asset) + '")';
}
else {
var file = (0, path_1.basename)(asset);
if (!assets[file] && (0, utils_1.fileExists)(asset)) {
if (options.storeImagesSeparately) {
(0, utils_1.copyInBase64)(asset, "".concat(outputDirectory, "/img/").concat(file));
rule.notation[entry[0]] = "url(./img/".concat(file, ")");
}
else {
(0, utils_1.copyInBase64)(asset, "".concat(outputDirectory, "/").concat(file));
rule.notation[entry[0]] = "url(./".concat(file, ")");
}
assets[file] = asset;
}
else if (assets[file] === asset) {
var id = 1;
var newcopy = (0, utils_1.getFileName)(file) + "-".concat(id) + (0, path_1.extname)(file);
while (assets[newcopy]) {
newcopy = (0, utils_1.getFileName)(file) + "-".concat(++id) + (0, path_1.extname)(file);
}
if (options.storeImagesSeparately) {
(0, utils_1.copyInBase64)(asset, "".concat(outputDirectory, "/img/").concat(newcopy));
rule.notation[entry[0]] = "url(./img/".concat(newcopy, ")");
}
else {
(0, utils_1.copyInBase64)(asset, "".concat(outputDirectory, "/").concat(newcopy));
rule.notation[entry[0]] = "url(./".concat(newcopy, ")");
}
assets[newcopy] = asset;
}
else if ((0, utils_1.fileExists)(asset)) {
rule.notation[entry[0]] = "url(./".concat(file, ")");
}
}
}
}
});
}
else if (rule instanceof types_1.FontFaceRule &&
rule.source.startsWith("url(")) {
var src = rule.source.slice(4, -1);
if (/"|'/.test(src[0]))
src = rule.source.slice(5, -2);
if (!src.startsWith("http://") && !src.startsWith("https://")) {
var asset = (0, utils_1.relativePath)(href, src);
if (options.wickedMode && (0, utils_1.fileExists)(asset)) {
rule.source = "url(\"".concat((0, utils_1.stringifytoBase64)(asset), "\")");
}
else {
var file = (0, path_1.basename)(asset);
(0, utils_1.tryMkingDir)("".concat(outputDirectory, "/fonts"));
if (!assets[file] && (0, utils_1.fileExists)(asset)) {
(0, utils_1.copyInBase64)(asset, "".concat(outputDirectory, "/fonts/").concat(file));
assets[file] = asset;
rule.source = "url(./fonts/".concat(file, ")");
}
else if (assets[file] && assets[file] !== asset) {
var id = 1;
var newcopy = (0, utils_1.getFileName)(file) + "-".concat(id) + (0, path_1.extname)(file);
while (assets[newcopy]) {
newcopy = (0, utils_1.getFileName)(file) + "-".concat(++id) + (0, path_1.extname)(file);
}
(0, utils_1.copyInBase64)(asset, "".concat(outputDirectory, "/fonts/").concat(newcopy));
assets[newcopy] = asset;
rule.source = "url(./fonts/".concat(newcopy, ")");
}
else if ((0, utils_1.fileExists)(asset)) {
rule.source = "url(./fonts/".concat(file, ")");
}
}
}
}
}
return AST.rules;
}
var styles = (0, tagNameSearch_1.default)(nodes, "style");
styles.forEach(function (style) {
var _a;
var AST = palette_1.default.parse((_a = style.content) !== null && _a !== void 0 ? _a : "");
AST.rules = __spreadArray([], resolveCSSImports(AST, (0, path_1.resolve)(source.toString())), true);
if (options.formatFiles) {
style.content = palette_1.default.generate(AST, { indent: " ", format: true });
}
else
style.content = palette_1.default.generate(AST, { indent: "", format: false });
});
var links = (0, tagNameSearch_1.default)(nodes, "link").filter(function (link) {
return link.attributes.href && link.attributes.rel === "stylesheet";
});
var head = (0, tagNameSearch_1.default)(nodes, "head")[0];
var outputAST = new types_1.Stylesheet(0, 0);
var outputText = "";
var outputDirectory = (0, utils_1.relativePath)(destination, "./");
links.forEach(function (link) {
var _a;
var href = (0, utils_1.relativePath)(source, link.attributes.href);
if ((0, utils_1.fileExists)(href)) {
trail.push(href);
var AST = palette_1.default.parse((0, fs_1.readFileSync)(href).toString());
(_a = outputAST.rules).push.apply(_a, resolveCSSImports(AST, href));
delete link.type;
}
});
if (links.length !== 0)
if (options.internalStyles || options.wickedMode) {
if (options.formatFiles) {
outputText = palette_1.default.generate(outputAST, {
format: true,
indent: " ",
});
}
else {
outputText = palette_1.default.generate(outputAST, { format: false, indent: "" });
}
var style = {
type: "element",
tagName: "style",
childID: (_a = head.children) === null || _a === void 0 ? void 0 : _a.length,
content: outputText,
};
(_b = head === null || head === void 0 ? void 0 : head.children) === null || _b === void 0 ? void 0 : _b.splice((_c = links[0].childID) !== null && _c !== void 0 ? _c : 0, 0, style);
}
else {
var outputFileName = (0, utils_1.getFileName)(destination) + ".bundle.css";
if (options.formatFiles)
outputText = palette_1.default.generate(outputAST, {
format: true,
indent: "",
});
else {
outputText = palette_1.default.generate(outputAST, {
format: false,
indent: "",
});
}
var bundledLink = {
type: "element",
tagName: "link",
isVoid: true,
childID: (_d = head.children) === null || _d === void 0 ? void 0 : _d.length,
attributeList: "rel=\"stylesheet\" href=\"./".concat(outputFileName, "\""),
attributes: {
rel: "stylesheet",
href: "./" + outputFileName,
},
content: outputText,
};
(_e = head === null || head === void 0 ? void 0 : head.children) === null || _e === void 0 ? void 0 : _e.splice((_f = links[0].childID) !== null && _f !== void 0 ? _f : 0, 0, bundledLink);
(0, fs_1.writeFileSync)("".concat(outputDirectory, "/").concat(outputFileName), outputText);
}
return nodes;
}
exports.default = resolveCSS;