UNPKG

@ribajs/router

Version:

Routing extension for Riba.js inspired by Barba.js

408 lines 35.4 kB
export * from "./Dom.js"; export * from "./Prefetch.js"; import { EventDispatcher } from "@ribajs/events"; import { HttpService } from "@ribajs/core"; import { cleanLink, getPort, normalizeUrl, getUrl, isBoolean, getElementFromEvent, getDataset, scrollTo, } from "@ribajs/utils"; import { BaseCache } from "@ribajs/cache"; import { HideShowTransition } from "../Transition/index.js"; import { Dom } from "./Dom.js"; import { HistoryManager } from "@ribajs/history"; import { ROUTE_ERROR_CLASS, IGNORE_CLASS_LINK } from "../../constants.js"; import { RouterService } from "../../services/index.js"; class Pjax { static cache = new BaseCache(); static getInstance(id = "main") { const result = Pjax.instances[id]; if (!result) { console.warn(`[Pjax.getInstance] No pjax instance for viewId "${id}" found!`); } return result; } static preventCheckUrl(href) { const element = document.createElement("a"); element.setAttribute("href", href); if (!element) { return false; } if (!href) { return false; } if (cleanLink(href) === cleanLink(location.href)) { return false; } if (window.location.protocol !== element.protocol || window.location.hostname !== element.hostname) { return false; } if (getPort() !== getPort(element.port)) { return false; } return true; } static preventCheck(url, element, evt) { if (!window.history.pushState) { return false; } if (!this.preventCheckUrl(url)) { return false; } if (evt) { if ((evt && evt.which && evt.which > 1) || evt.metaKey || evt.ctrlKey || evt.shiftKey || evt.altKey) { return false; } } if (element) { if (element.target && element.target === "_blank") { return false; } if (element.getAttribute && typeof element.getAttribute("download") === "string") { return false; } if (element.classList.contains(IGNORE_CLASS_LINK)) { return false; } } return true; } static getHref(el) { if (!el) { return undefined; } if (el.getAttribute && typeof el.getAttribute("xlink:href") === "string") { return el.getAttribute("xlink:href") || undefined; } if (typeof el.href === "string" || (el.hasAttribute && el.hasAttribute("href"))) { const href = el.href || el.getAttribute("href"); if (!href) { console.error("href attribute not found for element: ", el); throw new Error("href attribute not found!"); } return href; } return undefined; } static instances = {}; history = new HistoryManager(); cacheEnabled = true; transitionProgress = false; listenAllLinks; listenPopstate; parseTitle; changeBrowserUrl; dispatcher; transition; wrapper; viewId = "main"; containerSelector; prefetchLinks; scrollToAnchorOffset; constructor({ id, action = "replace", wrapper, containerSelector = "[data-namespace]", listenAllLinks = false, listenPopstate = true, parseTitle = true, changeBrowserUrl = true, prefetchLinks = true, scrollToTop = true, scrollToAnchorOffset = RouterService.options.scrollToAnchorOffset, }) { if (id) { this.viewId = id; } let instance = this; this.scrollToAnchorOffset = scrollToAnchorOffset || 0; this.dispatcher = new EventDispatcher(this.viewId); this.listenAllLinks = listenAllLinks; this.listenPopstate = listenPopstate; this.parseTitle = parseTitle; this.changeBrowserUrl = changeBrowserUrl; this.containerSelector = containerSelector; this.prefetchLinks = prefetchLinks; if (Pjax.instances[this.viewId]) { instance = Pjax.instances[this.viewId]; } instance.transition = instance.transition || new HideShowTransition(action, scrollToTop); instance.wrapper = instance.wrapper || wrapper; instance.containerSelector = instance.containerSelector || containerSelector; instance.listenAllLinks = isBoolean(instance.listenAllLinks) ? instance.listenAllLinks : listenAllLinks; instance.listenPopstate = isBoolean(instance.listenPopstate) ? instance.listenPopstate : listenPopstate; instance.parseTitle = isBoolean(instance.parseTitle) ? instance.parseTitle : parseTitle; instance.changeBrowserUrl = isBoolean(instance.changeBrowserUrl) ? instance.changeBrowserUrl : changeBrowserUrl; instance.prefetchLinks = isBoolean(instance.prefetchLinks) ? instance.prefetchLinks : prefetchLinks; if (instance.wrapper) { instance.wrapper.setAttribute("aria-live", "polite"); } Pjax.instances[this.viewId] = instance; return Pjax.instances[this.viewId]; } setActiveWrapper(wrapper) { this.wrapper = wrapper; } start() { if (this.wrapper) { try { this.init(this.wrapper, this.listenAllLinks, this.listenPopstate); } catch (error) { console.error(error); } } else { console.error(`Can't init pjax without wrapper`); } } getCurrentUrl() { return cleanLink(getUrl()); } goTo(url, newTab = false) { if (newTab) { const win = window.open(url, "_blank"); if (win) { return win.focus(); } return false; } if (url.startsWith("http")) { url = normalizeUrl(url).url; } if (!url.startsWith("http")) { if (this.changeBrowserUrl) { window.history.pushState(null, "", url); } return this.onStateChange(undefined, url); } else { this.forceGoTo(url); } } getTransition() { return this.transition || new HideShowTransition(); } prefetchLink(href) { href = normalizeUrl(href).url; const follow = Pjax.preventCheckUrl(href); if (follow) { return this.loadResponseCached(href, true, false); } } prefetchLinkElement(linkElement, head) { const rel = linkElement.getAttribute("rel"); const href = Pjax.getHref(linkElement); if (rel === "router-preload" && href && this.cacheEnabled && !linkElement.classList.contains(ROUTE_ERROR_CLASS)) { try { this.prefetchLink(href); } catch (error) { linkElement.classList.add(ROUTE_ERROR_CLASS); console.error(error); } } head.appendChild(linkElement); } removePrefetchLinks(head) { const removePrefetchLinkElements = head.querySelectorAll('link[href][rel="dns-prefetch"], link[href][rel="preconnect"], link[href][rel="prefetch"], link[href][rel="subresource"], link[href][rel="preload"], link[href][rel="router-preload"]'); removePrefetchLinkElements.forEach((linkElement) => { if (linkElement && linkElement.parentNode) { linkElement.parentNode.removeChild(linkElement); } }); } replacePrefetchLinkElements(prefetchLinks) { const head = document.head || document.getElementsByTagName("head")[0]; this.removePrefetchLinks(head); prefetchLinks.forEach((linkElement) => { this.prefetchLinkElement(linkElement, head); }); } async loadCached(url) { try { const { responsePromise } = await this.loadResponseCached(url, false, true); if (!this.wrapper) { throw new Error("[Pjax] you need a wrapper!"); } const response = await responsePromise; Dom.putContainer(response.container, this.wrapper); if (this.parseTitle === true && response.title) { document.title = response.title; } if (this.prefetchLinks === true && response.prefetchLinks) { this.replacePrefetchLinkElements(response.prefetchLinks); } return response.container; } catch (error) { console.error(error); this.forceGoTo(url); throw error; } } async loadResponseCached(url, forceCache = false, fallback = true) { let responsePromise; try { if (this.cacheEnabled) { responsePromise = Pjax.cache.get(url); if (responsePromise) { return { fromCache: true, responsePromise, }; } } responsePromise = this.loadResponse(url, forceCache); if (this.cacheEnabled && responsePromise) { Pjax.cache.set(url, responsePromise); } else { } } catch (error) { console.error(error); if (fallback) { this.forceGoTo(url); } throw error; } return { fromCache: false, responsePromise, }; } async loadResponse(url, forceCache = false) { const options = forceCache ? { cache: "force-cache" } : {}; const data = await HttpService.get(url, undefined, "html", {}, options); if (!data || !data.body) { throw new Error("No body!"); } const response = Dom.parseResponse(data.body, this.parseTitle, this.containerSelector, this.prefetchLinks); return response; } bindEvents(listenAllLinks, listenPopstate) { if (listenAllLinks) { document.addEventListener("click", this.onLinkClickIntern.bind(this)); } if (listenPopstate) { window.addEventListener("popstate", this.onStateChange.bind(this)); } } forceGoTo(url) { console.warn("forceGoTo", url); if (typeof url === "string") { window.location.href = url; } else if (url && url.href) { window.location.href = url.href; } else { throw new Error("Invalid url"); } } onLinkClickIntern(evt) { let el = getElementFromEvent(evt); while (el && !Pjax.getHref(el)) { el = el.parentNode; } if (!el || el.nodeName !== "A") { return; } const href = Pjax.getHref(el); if (el.classList.contains("route") || el.hasAttribute("rv-route")) { return; } if (!href) { throw new Error(`Url is not defined, you can't cache the link without the url. Please make sure your element has the href attribute or pass the url directly to this function.`); } if (el.classList.contains("route") || el.hasAttribute("rv-route")) { return false; } return this.onLinkClick(evt, el, href); } onLinkClick(evt, el, href, newTab = false) { const { url, location } = normalizeUrl(href); const { location: currLocation } = normalizeUrl(); if (location.hash && currLocation.pathname === location.pathname) { let id = location.hash.slice(1); id = decodeURI(id); const scrollToElement = document.getElementById(id); if (scrollToElement) { evt.stopPropagation(); evt.preventDefault(); if (this.changeBrowserUrl) { window.history.pushState(null, "", url); } return scrollTo(scrollToElement, this.scrollToAnchorOffset); } } if (!url) { throw new Error("url is falsy"); } const follow = Pjax.preventCheck(url, el, evt); if (follow) { evt.stopPropagation(); evt.preventDefault(); this.dispatcher.trigger("linkClicked", el, evt); this.goTo(url, newTab); } } async onStateChange(event, newUrl = this.getCurrentUrl()) { newUrl = normalizeUrl(newUrl).url; const oldUrl = normalizeUrl(this.history.currentStatus().url).url; if (this.changeBrowserUrl && oldUrl === newUrl) { return false; } this.history.add(newUrl); this.dispatcher.trigger("initStateChange", this.viewId, this.history.currentStatus(), this.history.prevStatus()); const oldContainer = Dom.getContainer(document, this.containerSelector); const newContainerPromise = this.loadCached(newUrl); const transition = this.getTransition(); this.transitionProgress = true; const transitionResult = transition.init(oldContainer, newContainerPromise); this.onNewContainerLoaded(await newContainerPromise); await transitionResult; this.onTransitionEnd(); } onNewContainerLoaded(container) { const currentStatus = this.history.currentStatus(); currentStatus.namespace = Dom.getNamespace(container); const dataset = getDataset(container); this.dispatcher.trigger("newPageReady", this.viewId, this.history.currentStatus(), this.history.prevStatus(), container, container.innerHTML, dataset, false); } onTransitionEnd() { this.transitionProgress = false; this.dispatcher.trigger("transitionCompleted", this.viewId, this.history.currentStatus(), this.history.prevStatus()); } init(wrapper, listenAllLinks, listenPopstate) { const initialResponse = Dom.parseInitial(this.parseTitle, this.containerSelector, this.prefetchLinks); const url = window.location.pathname; if (this.cacheEnabled) { const currentUrl = normalizeUrl(window.location.href).url; if (!Pjax.cache.get(url)) { this.loadResponseCached(currentUrl, false, false); } } this.replacePrefetchLinkElements(initialResponse.prefetchLinks); this.wrapper = wrapper; this.history.add(this.getCurrentUrl(), Dom.getNamespace(initialResponse.container)); this.dispatcher.trigger("initStateChange", this.viewId, this.history.currentStatus()); const dataset = getDataset(initialResponse.container); this.dispatcher.trigger("newPageReady", this.viewId, this.history.currentStatus(), {}, initialResponse.container, initialResponse.container.innerHTML, dataset, true); this.dispatcher.trigger("transitionCompleted", this.viewId, this.history.currentStatus()); this.bindEvents(listenAllLinks, listenPopstate); } } export { Pjax }; //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvc2VydmljZXMvUGpheC9pbmRleC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxjQUFjLFVBQVUsQ0FBQztBQUN6QixjQUFjLGVBQWUsQ0FBQztBQUU5QixPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFDakQsT0FBTyxFQUFFLFdBQVcsRUFBc0IsTUFBTSxjQUFjLENBQUM7QUFDL0QsT0FBTyxFQUNMLFNBQVMsRUFDVCxPQUFPLEVBQ1AsWUFBWSxFQUNaLE1BQU0sRUFDTixTQUFTLEVBQ1QsbUJBQW1CLEVBQ25CLFVBQVUsRUFDVixRQUFRLEdBQ1QsTUFBTSxlQUFlLENBQUM7QUFFdkIsT0FBTyxFQUFFLFNBQVMsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUMxQyxPQUFPLEVBQUUsa0JBQWtCLEVBQUUsTUFBTSx3QkFBd0IsQ0FBQztBQUU1RCxPQUFPLEVBQUUsR0FBRyxFQUFFLE1BQU0sVUFBVSxDQUFDO0FBQy9CLE9BQU8sRUFBRSxjQUFjLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUNqRCxPQUFPLEVBQUUsaUJBQWlCLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSxvQkFBb0IsQ0FBQztBQUMxRSxPQUFPLEVBQUUsYUFBYSxFQUFFLE1BQU0seUJBQXlCLENBQUM7QUFXeEQsTUFBTSxJQUFJO0lBQ0QsTUFBTSxDQUFDLEtBQUssR0FBRyxJQUFJLFNBQVMsRUFBcUIsQ0FBQztJQUVsRCxNQUFNLENBQUMsV0FBVyxDQUFDLEVBQUUsR0FBRyxNQUFNO1FBQ25DLE1BQU0sTUFBTSxHQUFHLElBQUksQ0FBQyxTQUFTLENBQUMsRUFBRSxDQUFDLENBQUM7UUFDbEMsSUFBSSxDQUFDLE1BQU0sRUFBRSxDQUFDO1lBQ1osT0FBTyxDQUFDLElBQUksQ0FDVixtREFBbUQsRUFBRSxVQUFVLENBQ2hFLENBQUM7UUFDSixDQUFDO1FBQ0QsT0FBTyxNQUFNLENB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