UNPKG

siphon-cli

Version:

Simple bundler for web applications. 📦🔧🧡

206 lines (205 loc) • 11.1 kB
"use strict"; 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;