@sujalchoudhari/solaris-ui
Version:
A UI framework to create HTML pages with just JavaScript.
106 lines • 5.14 kB
JavaScript
;
var __importDefault = (this && this.__importDefault) || function (mod) {
return (mod && mod.__esModule) ? mod : { "default": mod };
};
Object.defineProperty(exports, "__esModule", { value: true });
exports.SolarisUI = void 0;
const components_1 = require("./components");
const fs_1 = __importDefault(require("fs"));
const filemanager_1 = __importDefault(require("./utils/filemanager"));
const logger_1 = __importDefault(require("./utils/logger"));
const atom_1 = require("./atom");
const stylemanager_1 = __importDefault(require("./utils/stylemanager"));
const scriptmanager_1 = __importDefault(require("./utils/scriptmanager"));
const path_1 = __importDefault(require("path"));
/**
* @class Sloaris
* A UI framework to create HTML pages with just JavaScript.
* This component is responsible for building the entire UI framework.
* @license MIT license
* @author Sujal Choudhari <sujalchoudari@gmail.com>
*/
class SolarisUI {
// Load Components using Atom and Atomizer
// TODO: Reload and recompile the entire UI when the config changes.
// Utility functions
static createPage(title, url, meta, defaultPageTemplateFolderIndex, defaultBodyTemplateFolderIndex, defaultHeadTemplateFolderIndex) {
const headComponent = new atom_1.Atom(atom_1.Atomizer.templates[defaultHeadTemplateFolderIndex || 0].head, {
title: title, meta: meta, templatestyles: `
<link rel="stylesheet" href="./userStyles.css">
`
});
const bodyComponent = new atom_1.Atom(atom_1.Atomizer.templates[defaultBodyTemplateFolderIndex || 0].body, {
templateScripts: `
<script src="./userScripts.js"></script>
`
});
const pageAtom = new atom_1.Atom(atom_1.Atomizer.templates[defaultPageTemplateFolderIndex || 0].page, { head: headComponent, body: bodyComponent });
const page = atom_1.Atomizer.buildComponentTree(pageAtom.toString());
page.setAttribute("id", url);
return page;
}
/**
* Builds the pages in the project.
* @param name The name of the project.
* @param pages The pages of the project.
*/
static buildProject(name, pages) {
logger_1.default.start();
// Create FileManager object
const fm = new filemanager_1.default();
// Create build directory if it doesn't exist
if (!fs_1.default.existsSync("builds")) {
fm.createDirectory("builds");
}
// Remove existing build directory and create new one
logger_1.default.info(__filename, "Clearing the build directory");
fm.removeDirectory(`builds/${name}`, true);
fm.createDirectory(`builds/${name}`);
// Create templates directory and copy template files
logger_1.default.info(__filename, "Creating template files");
const templateDirectory = `builds/${name}/templates/`;
if (fs_1.default.existsSync(templateDirectory)) {
fm.removeDirectory(templateDirectory);
}
fm.createDirectory(templateDirectory);
Array.from(new Set(atom_1.Atomizer.templateFilesToInclude)).forEach((file) => {
fm.copyFile(file, templateDirectory);
const baseName = path_1.default.basename(file);
const extension = path_1.default.extname(file);
if (extension == ".js") {
new components_1.Script("external", `./templates/${baseName}`);
}
else if (extension == ".css") {
new components_1.Style("external", `./templates/${baseName}`);
}
console.log(baseName, extension);
});
// Create HTML files
logger_1.default.info(__filename, "Creating HTML files");
const styles = new Set(stylemanager_1.default.getExternalStyles());
const scripts = new Set(scriptmanager_1.default.getExternalScripts());
pages.forEach((page) => {
page.children[0].addChildren(...Array.from(styles).map((style) => new components_1.Component("link", { rel: "stylesheet", href: style.url })));
page.children[1].addChildren(...Array.from(scripts).map((script) => new components_1.Component("script", { src: script.url, ...(script.params) })));
fm.createFile(`builds/${name}/${page.getAttribute("id")}`, page.toString());
});
// Create CSS file
logger_1.default.info(__filename, "Creating CSS files");
const minifiedCSS = stylemanager_1.default.toString();
if (minifiedCSS) {
fm.createFile(`builds/${name}/userStyles.css`, minifiedCSS);
}
// Create JS file
logger_1.default.info(__filename, "Creating JS files");
const minifiedJS = scriptmanager_1.default.toString();
if (minifiedJS) {
fm.createFile(`builds/${name}/userScripts.js`, minifiedJS);
}
// Copy public folder
logger_1.default.info(__filename, "Copying public folders");
fm.copyTree("public", `builds/${name}/`);
logger_1.default.time(__filename, "Build completed in");
}
}
exports.SolarisUI = SolarisUI;
//# sourceMappingURL=solaris.js.map