UNPKG

@cimo/jsmvcfw

Version:

Javascript mvc framework. Light, fast and secure.

109 lines 4.24 kB
import { getUrlRoot, getControllerList, renderTemplate, renderAfter, frameworkReset } from "./JsMvcFw.js"; let routeList = []; let controller; const cleanUrl = (urlNext) => { const [path, queryString] = urlNext.split("?"); const queryStringCleanedList = []; if (queryString) { const queryStringList = queryString.split("&"); for (let a = 0; a < queryStringList.length; a++) { const param = queryStringList[a]; const [key, value] = param.split("="); const keyCleaned = encodeURIComponent(decodeURIComponent(key.replace(/</g, "&lt;").replace(/>/g, "&gt;").replace(/"/g, "&quot;").replace(/'/g, "&#39;"))); if (value) { const valueCleaned = encodeURIComponent(decodeURIComponent(value.replace(/</g, "&lt;").replace(/>/g, "&gt;").replace(/"/g, "&quot;").replace(/'/g, "&#39;"))); queryStringCleanedList.push(`${keyCleaned}=${valueCleaned}`); } else { queryStringCleanedList.push(keyCleaned); } } } const pathCleaned = path.replace(/</g, "&lt;").replace(/>/g, "&gt;").replace(/"/g, "&quot;").replace(/'/g, "&#39;"); const urlCleaned = pathCleaned + (queryStringCleanedList.length > 0 ? "?" + queryStringCleanedList.join("&") : ""); return urlCleaned; }; const historyPush = (urlNext, parameterObject, parameterSearch, title = "") => { const data = { urlPrevious: window.location.pathname, parameterObject, parameterSearch }; window.history.pushState(data, title, cleanUrl(urlNext)); }; const deleteController = () => { if (controller) { const controllerList = getControllerList(); for (let a = controllerList.length - 1; a >= 0; a--) { for (const children of controllerList[a].childrenList) { children.destroy(); } } controller.destroy(); } }; const deleteTrail = (value) => { return value.endsWith("/") && value.length > 1 ? value.slice(0, -1) : value; }; const populatePage = (urlNext, isSoft, parameterObject, parameterSearch) => { if (!isSoft) { if (parameterSearch) { window.location.search = parameterSearch; } window.location.href = cleanUrl(urlNext); } else { let isNotFound = true; const urlNextTrail = deleteTrail(urlNext); for (const route of routeList) { const routePathTrail = deleteTrail(`${getUrlRoot()}${route.path}`); if (routePathTrail === urlNextTrail) { isNotFound = false; frameworkReset(); historyPush(urlNextTrail, parameterObject, parameterSearch, route.title); document.title = route.title; deleteController(); controller = route.controller(); renderTemplate(controller, undefined, () => { controller.event(); renderAfter(controller).then(() => { controller.rendered(); }); }); break; } } if (isNotFound) { historyPush(`${getUrlRoot()}/404`, parameterObject, parameterSearch, "404"); document.title = "404"; const elementRoot = document.getElementById("jsmvcfw_app"); if (elementRoot) { elementRoot.innerHTML = "Route not found!"; } } } }; export const route = (routeListValue) => { routeList = routeListValue; window.onload = (event) => { if (event) { populatePage(window.location.pathname, true); } }; window.onpopstate = (event) => { const data = event.state; if (data.urlPrevious) { populatePage(data.urlPrevious, true); } else { populatePage(window.location.pathname, true); } }; window.onbeforeunload = () => { deleteController(); }; }; export const navigateTo = (urlNext, isSoft = true, parameterObject, parameterSearch) => { populatePage(urlNext, isSoft, parameterObject, parameterSearch); }; //# sourceMappingURL=JsMvcFwRoute.js.map