UNPKG

ckn.server

Version:

206 lines (195 loc) 9.39 kB
import { ckn } from "ckn"; import { CKNFile } from "ckn.file"; import { CKNServer } from "./ckn.server.js"; import { CKNController } from "./ckn.server.controller.js"; import { CKNView } from './ckn.server.view.js'; import express from "express"; class CKNApplication { constructor(name) { ckn.log.info("Loading App: " + name); this.pathPrefix = process.env.MODE == "packagedev" ? "./" : '../../'; this.name = name; this.url = name === "main" ? "" : name; this.physicalPath = CKNServer.directoryPath + "/"+this.pathPrefix+"apps/" + name; this.logicalPath = this.pathPrefix + "apps/" + this.name; this.models = []; this.controllers = []; this.views = []; } initial = async (server) => { this.server = server; ckn.log.info("Application(" + this.name + ") is loading.."); await this.#loadPublicFolder(server); await this.#loadModels(server); await this.#loadControllers(server); await this.#loadViews(server); ckn.log.info("Application(" + this.name + ") is loaded"); } #loadPublicFolder = async (server) => { ckn.log.info("Load public folder for " + this.name +"."); let publicFolder = this.physicalPath + "/public"; server.server.use("/" + this.url, express.static(publicFolder)); } #loadModels = async (server) => { ckn.log.info("Load models for " + this.name + "."); let files = await CKNFile.getFiles(this.physicalPath + "/models"); for (const file of files) { let model = await import(this.logicalPath + "/models/" + file.name); let modelName = file.name.replace(".js", ""); ckn.log.info("Load " + this.name + " model."); this.models[modelName] = model[modelName]; } } #executeMiddleWare = async (process, session) => { let run = () => { if (run.index == this.server.middlewares.length) { process(session); } else { run.index++; this.server.middlewares[run.index - 1](session, run); } } run.index = 0; run(); } #loadControllers = async (server) => { ckn.log.info("Load controller for " + this.name); let files = await CKNFile.getFiles(this.physicalPath + "/controllers"); for (const file of files) { let controller = await import(this.logicalPath + "/controllers/" + file.name); let controllerName = file.name.replace(".js", ""); controller = new controller[controllerName](controllerName); controller.initial(server); this.controllers[controllerName] = controller; Object.keys(controller).forEach(key => { if (typeof controller[key] == "object" && controller[key].process != null) { let process = controller[key].process; let cors = controller[key].cors; let isPublic = controller[key].public; let method = controller[key].method == null ? CKNController.Method.GET : controller[key].method; let processURL = controller[key].url == null ? key : controller[key].url; if (processURL === "default") processURL = ""; let url = (this.url === "" ? "" : "/" + this.url) + (controller.url === "" ? "" : "/" + controller.url) + (processURL === "" ? "" : "/" + processURL); controller[key].fullURL = url; controller[key].name = key; ckn.log.info("Initial URL>" + method + ">" + url); switch (method) { case CKNController.Method.GET: server.get(url, session => { ckn.log.info("GET>" + url); session.isPublic = isPublic == true; this.#executeMiddleWare(process,session); }, cors); break; case CKNController.Method.POST: server.post(url, session => { ckn.log.info("POST>" + url); session.isPublic = isPublic == true; this.#executeMiddleWare(process,session); }, cors); break; case CKNController.Method.PATCH: server.patch(url, session => { ckn.log.info("PATCH>" + url); session.isPublic = isPublic == true; this.#executeMiddleWare(process,session); }, cors); break; case CKNController.Method.PUT: server.put(url, session => { ckn.log.info("PUT>" + url); session.isPublic = isPublic == true; this.#executeMiddleWare(process,session); }, cors); break; case CKNController.Method.DELETE: server.delete(url, session => { ckn.log.info("DELETE>" + url); session.isPublic = isPublic == true; this.#executeMiddleWare(process,session); }, cors); break; } } }); } } #loadViews = async (server) => { // For EJS View ckn.log.info("Load views for " + this.name); this.views.push(this.physicalPath + "/views"); // For ckn.view let files = await CKNFile.getFiles(this.physicalPath + "/views"); files = files.where(file => file.name.toLowerCase().endsWith(".cknview")); for (const file of files) { console.log(file) let fileName = file.name; let tagName = fileName.replaceAll(".cknview", ""); tagName = tagName.replaceAll(".",""); let viewFile = new CKNFile(this.physicalPath + "/views/" + fileName); let viewContent = await viewFile.readAllText(); let component = CKNView.register(tagName, viewContent) CKNApplication.viewComponents[tagName] = component; } if (CKNFile.exist(this.physicalPath + "/components")) { let files = await CKNFile.getFiles(this.physicalPath + "/components", true); files = files.where(file => file.name.toLowerCase().endsWith(".cknview")); for (const file of files) { console.log(file) let fileName = file.name; let tagName = fileName.replaceAll(".cknview", ""); tagName = tagName.replaceAll(".",""); let viewFile = file;//new CKNFile(this.physicalPath + "/components/" + fileName); let viewContent = await viewFile.readAllText(); let component = CKNView.register(tagName, viewContent) CKNApplication.viewComponents[tagName] = component; } } for (const file of files) { console.log(file) let fileName = file.name; let tagName = fileName.replaceAll(".cknview", ""); tagName = tagName.replaceAll(".",""); let viewFile = file;//new CKNFile(this.physicalPath + "/views/" + fileName); let viewContent = await viewFile.readAllText(); let component = CKNView.register(tagName, viewContent) CKNApplication.viewComponents[tagName] = component; } for (const tagName of Object.keys(CKNApplication.viewComponents)) { server.get("/ckn.server/components/"+tagName + ".js", session => { ckn.log.info("GET> " + tagName + ".js"); session.response.type(".js").send(CKNApplication.viewComponents[tagName].script); }, () => { return { origin: '*' } }); server.get("/ckn.server/components/"+tagName + ".html", session => { ckn.log.info("GET> " + tagName + ".html"); session.response.type(".html").send(CKNApplication.viewComponents[tagName].template); }, () => { return { origin: '*' } }); server.get("/ckn.server/components/"+tagName + ".css", session => { ckn.log.info("GET> " + tagName + ".css"); session.response.type(".css").send(CKNApplication.viewComponents[tagName].style); }, () => { return { origin: '*' } }); } server.get("/ckn.server/components", session => { let obj = []; for (let key of Object.keys(CKNApplication.viewComponents)) { obj.push(key); } session.send(obj); }); } } CKNApplication.viewComponents = {}; export { CKNApplication }