{"version":3,"file":"taxi.umd.js","sources":["../src/helpers.js","../src/Transition.js","../src/Renderer.js","../src/RouteStore.js","../src/Core.js"],"sourcesContent":["const parser = new DOMParser()\r\n\r\n/**\r\n * Parse a HTML string into a proper Document.\r\n * @param {string|Document} html\r\n * @return {Document|*}\r\n */\r\nexport function parseDom(html) {\r\n\treturn typeof html === 'string' ? parser.parseFromString(html, 'text/html') : html\r\n}\r\n\r\n/**\r\n * Extract details from a given URL string. Assumed to be on the current TLD.\r\n * @param {string} url\r\n * @return {{raw: string, href: string, host: string, hasHash: boolean, pathname: string}}\r\n */\r\nexport function processUrl(url) {\r\n\tconst details = new URL(url, window.location.origin)\r\n\tlet normalized = null\r\n\r\n\tif (details.hash.length) {\r\n\t\tnormalized = url.replace(details.hash, '')\r\n\t}\r\n\r\n\treturn {\r\n\t\thasHash: details.hash.length > 0,\r\n\t\tpathname: details.pathname,\r\n\t\thost: details.host,\r\n\t\traw: url,\r\n\t\thref: normalized || details.href\r\n\t}\r\n}\r\n\r\n/**\r\n * Reloads a provided script/stylesheet by replacing with itself.\r\n * @param {HTMLElement} node\r\n */\r\nexport function reloadScript(node) {\r\n\tnode.parentNode.replaceChild(duplicateScript(node), node)\r\n}\r\n\r\n/**\r\n * Loads a provided script/stylesheet by appending a clone to the current document.\r\n * @param {HTMLElement} node\r\n */\r\nexport function appendScript(node) {\r\n\tif (node.parentNode.tagName === 'HEAD') {\r\n\t\tdocument.head.appendChild(duplicateScript(node))\r\n\t} else {\r\n\t\tdocument.body.appendChild(duplicateScript(node))\r\n\t}\r\n}\r\n\r\n/**\r\n * Creates a clone of a given HTMLElement\r\n * @param {HTMLElement} node\r\n * @return {HTMLElement}\r\n */\r\nexport function duplicateScript(node) {\r\n\tconst replacement = document.createElement('SCRIPT')\r\n\r\n\t// Loop Over Attributes\r\n\tfor (let k = 0; k < node.attributes.length; k++) {\r\n\t\t// Get Attribute\r\n\t\tconst attr = node.attributes[k]\r\n\r\n\t\t// Set Attribute\r\n\t\treplacement.setAttribute(attr.nodeName, attr.nodeValue)\r\n\t}\r\n\r\n\t// Inline Script\r\n\tif (node.innerHTML) {\r\n\t\treplacement.innerHTML = node.innerHTML\r\n\t}\r\n\r\n\treturn replacement\r\n}\r\n","export default class Transition {\r\n\t/**\r\n\t * @param {{wrapper: HTMLElement}} props\r\n\t */\r\n\tconstructor({ wrapper }) {\r\n\t\tthis.wrapper = wrapper\r\n\t}\r\n\r\n\t/**\r\n\t * @param {{ from: HTMLElement|Element, trigger: string|HTMLElement|false }} props\r\n\t * @return {Promise}\r\n\t */\r\n\tleave(props) {\r\n\t\treturn new Promise((resolve) => {\r\n\t\t\tthis.onLeave({ ...props, done: resolve })\r\n\t\t})\r\n\t}\r\n\r\n\t/**\r\n\t * @param {{ to: HTMLElement|Element, trigger: string|HTMLElement|false }} props\r\n\t * @return {Promise}\r\n\t */\r\n\tenter(props) {\r\n\t\treturn new Promise((resolve) => {\r\n\t\t\tthis.onEnter({ ...props, done: resolve })\r\n\t\t})\r\n\t}\r\n\r\n\t/**\r\n\t * Handle the transition leaving the previous page.\r\n\t * @param {{from: HTMLElement|Element, trigger: string|HTMLElement|false, done: function}} props\r\n\t */\r\n\tonLeave({ from, trigger, done }) {\r\n\t\tdone()\r\n\t}\r\n\r\n\t/**\r\n\t * Handle the transition entering the next page.\r\n\t * @param {{to: HTMLElement|Element, trigger: string|HTMLElement|false, done: function}} props\r\n\t */\r\n\tonEnter({ to, trigger, done }) {\r\n\t\tdone()\r\n\t}\r\n}\r\n","import Transition from \"./Transition\"\r\n\r\nexport default class Renderer {\r\n\t/**\r\n\t * @param {{content: HTMLElement|Element, page: Document|Node, title: string, wrapper: Element}} props\r\n\t */\r\n\tconstructor({ content, page, title, wrapper }) {\r\n\t\tthis._contentString = content.outerHTML\r\n\t\tthis._DOM = null\r\n\t\tthis.page = page\r\n\t\tthis.title = title\r\n\t\tthis.wrapper = wrapper\r\n\t\tthis.content = this.wrapper.lastElementChild\r\n\t}\r\n\r\n\tonEnter() {\r\n\r\n\t}\r\n\r\n\tonEnterCompleted() {\r\n\r\n\t}\r\n\r\n\tonLeave() {\r\n\r\n\t}\r\n\r\n\tonLeaveCompleted() {\r\n\r\n\t}\r\n\r\n\tinitialLoad() {\r\n\t\tthis.onEnter()\r\n\t\tthis.onEnterCompleted()\r\n\t}\r\n\r\n\tupdate() {\r\n\t\tdocument.title = this.title\r\n\t\tthis.wrapper.appendChild(this._DOM.firstElementChild)\r\n\t\tthis.content = this.wrapper.lastElementChild\r\n\t\tthis._DOM = null\r\n\t}\r\n\r\n\tcreateDom() {\r\n\t\tif (!this._DOM) {\r\n\t\t\tthis._DOM = document.createElement('div')\r\n\t\t\tthis._DOM.innerHTML = this._contentString\r\n\t\t}\r\n\t}\r\n\r\n\tremove() {\r\n\t\tthis.wrapper.firstElementChild.remove()\r\n\t}\r\n\r\n\t/**\r\n\t * Called when transitioning into the current page.\r\n\t * @param {Transition} transition\r\n\t * @param {string|HTMLElement|false} trigger\r\n\t * @return {Promise}\r\n\t */\r\n\tenter(transition, trigger) {\r\n\t\treturn new Promise((resolve) => {\r\n\t\t\tthis.onEnter()\r\n\r\n\t\t\ttransition.enter({ trigger, to: this.content })\r\n\t\t\t\t.then(() => {\r\n\t\t\t\t\tthis.onEnterCompleted()\r\n\t\t\t\t\tresolve()\r\n\t\t\t\t})\r\n\t\t})\r\n\t}\r\n\r\n\t/**\r\n\t * Called when transitioning away from the current page.\r\n\t * @param {Transition} transition\r\n\t * @param {string|HTMLElement|false} trigger\r\n\t * @param {boolean} removeOldContent\r\n\t * @return {Promise}\r\n\t */\r\n\tleave(transition, trigger, removeOldContent) {\r\n\t\treturn new Promise((resolve) => {\r\n\t\t\tthis.onLeave()\r\n\r\n\t\t\ttransition.leave({ trigger, from: this.content })\r\n\t\t\t\t.then(() => {\r\n\t\t\t\t\tif (removeOldContent) {\r\n\t\t\t\t\t\tthis.remove()\r\n\t\t\t\t\t}\r\n\r\n\t\t\t\t\tthis.onLeaveCompleted()\r\n\t\t\t\t\tresolve()\r\n\t\t\t\t})\r\n\t\t})\r\n\t}\r\n}\r\n","export default class RouteStore {\r\n\t/**\r\n\t * @type {Map>}\r\n\t */\r\n\tdata = new Map()\r\n\r\n\t/**\r\n\t * @type {Map}\r\n\t */\r\n\tregexCache = new Map()\r\n\r\n\t/**\r\n\t *\r\n\t * @param {string} fromPattern\r\n\t * @param {string} toPattern\r\n\t * @param {string} transition\r\n\t */\r\n\tadd(fromPattern, toPattern, transition) {\r\n\t\tif (!this.data.has(fromPattern)) {\r\n\t\t\tthis.data.set(fromPattern, new Map())\r\n\t\t\tthis.regexCache.set(fromPattern, new RegExp(`^${fromPattern}$`))\r\n\t\t}\r\n\r\n\t\tthis.data.get(fromPattern).set(toPattern, transition)\r\n\t\tthis.regexCache.set(toPattern, new RegExp(`^${toPattern}$`))\r\n\t}\r\n\r\n\t/**\r\n\t *\r\n\t * @param {{ raw: string, href: string, hasHash: boolean, pathname: string }} currentUrl\r\n\t * @param {{ raw: string, href: string, hasHash: boolean, pathname: string }} nextUrl\r\n\t * @return {string|null}\r\n\t */\r\n\tfindMatch(currentUrl, nextUrl) {\r\n\t\t// Loop through all from patterns\r\n\t\tfor (const [fromPattern, potentialMatches] of this.data) {\r\n\t\t\t// If we have a match\r\n\t\t\tif (currentUrl.pathname.match(this.regexCache.get(fromPattern))) {\r\n\t\t\t\t// loop through all associated to patterns\r\n\t\t\t\tfor (const [toPattern, transition] of potentialMatches) {\r\n\t\t\t\t\t// If we find a match, return it\r\n\t\t\t\t\tif (nextUrl.pathname.match(this.regexCache.get(toPattern))) {\r\n\t\t\t\t\t\treturn transition\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\r\n\t\t\t\tbreak\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\treturn null\r\n\t}\r\n}\r\n","import E from '@unseenco/e'\nimport { appendScript, parseDom, processUrl, reloadScript } from './helpers'\nimport Transition from './Transition'\nimport Renderer from './Renderer'\nimport RouteStore from './RouteStore'\n\nconst IN_PROGRESS = 'A transition is currently in progress'\n\n/**\n * @typedef CacheEntry\n * @type {object}\n * @property {typeof Renderer|Renderer} renderer\n * @property {Document|Node} page\n * @property {array} scripts\n * @property {boolean} skipCache\n * @property {string} title\n * @property {HTMLElement|Element} content\n */\n\nexport default class Core {\n\tisTransitioning = false\n\n\t/**\n\t * @type {CacheEntry|null}\n\t */\n\tcurrentCacheEntry = null\n\n\t/**\n\t * @type {Map}\n\t */\n\tcache = new Map()\n\n\t/**\n\t * @private\n\t * @type {Map}\n\t */\n\tactivePromises = new Map()\n\n\t/**\n\t * @param {{\n\t * \t\tlinks?: string,\n\t * \t\tremoveOldContent?: boolean,\n\t * \t\tallowInterruption?: boolean,\n\t * \t\tbypassCache?: boolean,\n\t * \t\tenablePrefetch?: boolean,\n\t * \t\trenderers?: Object.,\n\t * \t\ttransitions?: Object.,\n\t * \t\treloadJsFilter?: boolean|function(HTMLElement): boolean\n\t * }} parameters\n\t */\n\tconstructor(parameters = {}) {\n\t\tconst {\n\t\t\tlinks = 'a:not([target]):not([href^=\\\\#]):not([data-taxi-ignore])',\n\t\t\tremoveOldContent = true,\n\t\t\tallowInterruption = false,\n\t\t\tbypassCache = false,\n\t\t\tenablePrefetch = true,\n\t\t\trenderers = {\n\t\t\t\tdefault: Renderer\n\t\t\t},\n\t\t\ttransitions = {\n\t\t\t\tdefault: Transition\n\t\t\t},\n\t\t\treloadJsFilter = (element) => element.dataset.taxiReload !== undefined\n\t\t} = parameters\n\n\t\tthis.renderers = renderers\n\t\tthis.transitions = transitions\n\t\tthis.defaultRenderer = this.renderers.default || Renderer\n\t\tthis.defaultTransition = this.transitions.default || Transition\n\t\tthis.wrapper = document.querySelector('[data-taxi]')\n\t\tthis.reloadJsFilter = reloadJsFilter\n\t\tthis.removeOldContent = removeOldContent\n\t\tthis.allowInterruption = allowInterruption\n\t\tthis.bypassCache = bypassCache\n\t\tthis.enablePrefetch = enablePrefetch\n\t\tthis.cache = new Map()\n\t\tthis.isPopping = false\n\n\t\t// Add delegated link events\n\t\tthis.attachEvents(links)\n\n\t\tthis.currentLocation = processUrl(window.location.href)\n\n\t\t// as this is the initial page load, prime this page into the cache\n\t\tthis.cache.set(this.currentLocation.href, this.createCacheEntry(document.cloneNode(true)))\n\n\t\t// fire the current Renderer enter methods\n\t\tthis.currentCacheEntry = this.cache.get(this.currentLocation.href)\n\t\tthis.currentCacheEntry.renderer.initialLoad()\n\t}\n\n\t/**\n\t * @param {string} renderer\n\t */\n\tsetDefaultRenderer(renderer) {\n\t\tthis.defaultRenderer = this.renderers[renderer]\n\t}\n\n\t/**\n\t * @param {string} transition\n\t */\n\tsetDefaultTransition(transition) {\n\t\tthis.defaultTransition = this.transitions[transition]\n\t}\n\n\t/**\n\t * Registers a route into the RouteStore\n\t *\n\t * @param {string} fromPattern\n\t * @param {string} toPattern\n\t * @param {string} transition\n\t */\n\taddRoute(fromPattern, toPattern, transition) {\n\t\tif (!this.router) {\n\t\t\tthis.router = new RouteStore()\n\t\t}\n\n\t\tthis.router.add(fromPattern, toPattern, transition)\n\t}\n\n\t/**\n\t * Prime the cache for a given URL\n\t *\n\t * @param {string} url\n\t * @param {boolean} [preloadAssets]\n\t * @return {Promise}\n\t */\n\tpreload(url, preloadAssets = false) {\n\t\t// convert relative URLs to absolute\n\t\turl = processUrl(url).href\n\n\t\tif (!this.cache.has(url)) {\n\t\t\treturn this.fetch(url, false)\n\t\t\t\t.then(async (newPage) => {\n\t\t\t\t\tthis.cache.set(url, this.createCacheEntry(newPage))\n\n\t\t\t\t\tif (preloadAssets) {\n\t\t\t\t\t\tthis.cache.get(url).renderer.createDom()\n\t\t\t\t\t}\n\t\t\t\t})\n\t\t}\n\n\t\treturn Promise.resolve()\n\t}\n\n\t/**\n\t * Updates the HTML cache for a given URL.\n\t * If no URL is passed, then cache for the current page is updated.\n\t * Useful when adding/removing content via AJAX such as a search page or infinite loader.\n\t *\n\t * @param {string} [url]\n\t */\n\tupdateCache(url) {\n\t\tconst key = processUrl(url || window.location.href).href\n\n\t\tif (this.cache.has(key)) {\n\t\t\tthis.cache.delete(key)\n\t\t}\n\n\t\tthis.cache.set(key, this.createCacheEntry(document.cloneNode(true)))\n\t}\n\n\t/**\n\t * Clears the cache for a given URL.\n\t * If no URL is passed, then cache for the current page is cleared.\n\t *\n\t * @param {string} [url]\n\t */\n\tclearCache(url) {\n\t\tconst key = processUrl(url || window.location.href).href\n\n\t\tif (this.cache.has(key)) {\n\t\t\tthis.cache.delete(key)\n\t\t}\n\t}\n\n\t/**\n\t * @param {string} url\n\t * @param {string|false} [transition]\n\t * @param {string|false|HTMLElement} [trigger]\n\t * @return {Promise}\n\t */\n\tnavigateTo(url, transition = false, trigger = false) {\n\t\treturn new Promise((resolve, reject) => {\n\t\t\t// Don't allow multiple navigations to occur at once\n\t\t\tif (!this.allowInterruption && this.isTransitioning) {\n\t\t\t\treject(new Error(IN_PROGRESS))\n\t\t\t\treturn\n\t\t\t}\n\n\t\t\tthis.isTransitioning = true\n\t\t\tthis.isPopping = true\n\t\t\tthis.targetLocation = processUrl(url)\n\t\t\tthis.popTarget = window.location.href\n\n\t\t\tconst TransitionClass = new (this.chooseTransition(transition))({ wrapper: this.wrapper })\n\n\t\t\tlet navigationPromise\n\n\t\t\tif (this.bypassCache || !this.cache.has(this.targetLocation.href) || this.cache.get(this.targetLocation.href).skipCache) {\n\t\t\t\tconst fetched = this.fetch(this.targetLocation.href)\n\t\t\t\t\t.then((newPage) => {\n\t\t\t\t\t\tthis.cache.set(this.targetLocation.href, this.createCacheEntry(newPage))\n\t\t\t\t\t\tthis.cache.get(this.targetLocation.href).renderer.createDom()\n\t\t\t\t\t})\n\n\t\t\t\tnavigationPromise = this.beforeFetch(this.targetLocation, TransitionClass, trigger)\n\t\t\t\t\t.then(async () => {\n\t\t\t\t\t\treturn fetched.then(async () => {\n\t\t\t\t\t\t\treturn await this.afterFetch(this.targetLocation, TransitionClass, this.cache.get(this.targetLocation.href), trigger)\n\t\t\t\t\t\t})\n\t\t\t\t\t})\n\t\t\t} else {\n\t\t\t\tthis.cache.get(this.targetLocation.href).renderer.createDom()\n\n\t\t\t\tnavigationPromise = this.beforeFetch(this.targetLocation, TransitionClass, trigger)\n\t\t\t\t\t.then(async () => {\n\t\t\t\t\t\treturn await this.afterFetch(this.targetLocation, TransitionClass, this.cache.get(this.targetLocation.href), trigger)\n\t\t\t\t\t})\n\t\t\t}\n\n\t\t\tnavigationPromise.then(() => {\n\t\t\t\tresolve()\n\t\t\t})\n\t\t})\n\t}\n\n\t/**\n\t * Add an event listener.\n\t * @param {string} event\n\t * @param {any} callback\n\t */\n\ton(event, callback) {\n\t\tE.on(event, callback)\n\t}\n\n\t/**\n\t * Remove an event listener.\n\t * @param {string} event\n\t * @param {any} [callback]\n\t */\n\toff(event, callback) {\n\t\tE.off(event, callback)\n\t}\n\n\t/**\n\t * @private\n\t * @param {{ raw: string, href: string, hasHash: boolean, pathname: string }} url\n\t * @param {Transition} TransitionClass\n\t * @param {string|HTMLElement|false} trigger\n\t * @return {Promise}\n\t */\n\tbeforeFetch(url, TransitionClass, trigger) {\n\t\tE.emit('NAVIGATE_OUT', {\n\t\t\tfrom: this.currentCacheEntry,\n\t\t\ttrigger\n\t\t})\n\n\t\treturn new Promise((resolve) => {\n\t\t\tthis.currentCacheEntry.renderer.leave(TransitionClass, trigger, this.removeOldContent)\n\t\t\t\t.then(() => {\n\t\t\t\t\tif (trigger !== 'popstate') {\n\t\t\t\t\t\twindow.history.pushState({}, '', url.raw)\n\t\t\t\t\t}\n\n\t\t\t\t\tresolve()\n\t\t\t\t})\n\t\t})\n\t}\n\n\t/**\n\t * @private\n\t * @param {{ raw: string, href: string, host: string, hasHash: boolean, pathname: string }} url\n\t * @param {Transition} TransitionClass\n\t * @param {CacheEntry} entry\n\t * @param {string|HTMLElement|false} trigger\n\t * @return {Promise}\n\t */\n\tafterFetch(url, TransitionClass, entry, trigger) {\n\t\tthis.currentLocation = url\n\t\tthis.popTarget = this.currentLocation.href\n\n\t\treturn new Promise((resolve) => {\n\t\t\tentry.renderer.update()\n\n\t\t\tE.emit('NAVIGATE_IN', {\n\t\t\t\tfrom: this.currentCacheEntry,\n\t\t\t\tto: entry,\n\t\t\t\ttrigger\n\t\t\t})\n\n\t\t\tif (this.reloadJsFilter) {\n\t\t\t\tthis.loadScripts(entry.scripts)\n\t\t\t}\n\n\t\t\tentry.renderer.enter(TransitionClass, trigger)\n\t\t\t\t.then(() => {\n\t\t\t\t\tE.emit('NAVIGATE_END', {\n\t\t\t\t\t\tfrom: this.currentCacheEntry,\n\t\t\t\t\t\tto: entry,\n\t\t\t\t\t\ttrigger\n\t\t\t\t\t})\n\n\t\t\t\t\tthis.currentCacheEntry = entry\n\t\t\t\t\tthis.isTransitioning = false\n\t\t\t\t\tthis.isPopping = false\n\t\t\t\t\tresolve()\n\t\t\t\t})\n\t\t})\n\t}\n\n\t/**\n\t * Load up scripts from the target page if needed\n\t *\n\t * @param {HTMLElement[]} cachedScripts\n\t */\n\tloadScripts(cachedScripts) {\n\t\tconst newScripts = [...cachedScripts]\n\t\tconst currentScripts = Array.from(document.querySelectorAll('script')).filter(this.reloadJsFilter)\n\n\t\t// loop through all new scripts\n\t\tfor (let i = 0; i < currentScripts.length; i++) {\n\t\t\tfor (let n = 0; n < newScripts.length; n++) {\n\t\t\t\tif (currentScripts[i].outerHTML === newScripts[n].outerHTML) {\n\t\t\t\t\treloadScript(currentScripts[i])\n\t\t\t\t\tnewScripts.splice(n, 1)\n\t\t\t\t\tbreak\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tfor (const script of newScripts) {\n\t\t\tappendScript(script)\n\t\t}\n\t}\n\n\t/**\n\t * @private\n\t * @param {string} links\n\t */\n\tattachEvents(links) {\n\t\tE.delegate('click', links, this.onClick)\n\t\tE.on('popstate', window, this.onPopstate)\n\n\t\tif (this.enablePrefetch) {\n\t\t\tE.delegate('mouseenter focus', links, this.onPrefetch)\n\t\t}\n\t}\n\n\t/**\n\t * @private\n\t * @param {MouseEvent} e\n\t */\n\tonClick = (e) => {\n\t\tif (!(e.metaKey || e.ctrlKey)) {\n\t\t\tconst target = processUrl(e.currentTarget.href)\n\t\t\tthis.currentLocation = processUrl(window.location.href)\n\n\t\t\tif (this.currentLocation.host !== target.host) {\n\t\t\t\treturn\n\t\t\t}\n\n\t\t\t// the target is a new URL, or is removing the hash from the current URL\n\t\t\tif (this.currentLocation.href !== target.href || (this.currentLocation.hasHash && !target.hasHash)) {\n\t\t\t\te.preventDefault()\n\t\t\t\t// noinspection JSIgnoredPromiseFromCall\n\t\t\t\tthis.navigateTo(target.raw, e.currentTarget.dataset.transition || false, e.currentTarget).catch(err => console.warn(err))\n\t\t\t\treturn\n\t\t\t}\n\n\t\t\t// a click to the current URL was detected\n\t\t\tif (!this.currentLocation.hasHash && !target.hasHash) {\n\t\t\t\te.preventDefault()\n\t\t\t}\n\t\t}\n\t}\n\n\t/**\n\t * @private\n\t * @return {void|boolean}\n\t */\n\tonPopstate = () => {\n\t\t// don't trigger for on-page anchors\n\t\tif (window.location.pathname === this.currentLocation.pathname && !this.isPopping) {\n\t\t\treturn false\n\t\t}\n\n\t\tif (!this.allowInterruption && (this.isTransitioning || this.isPopping)) {\n\t\t\t// overwrite history state with current page if currently navigating\n\t\t\twindow.history.pushState({}, '', this.popTarget)\n\t\t\tconsole.warn(IN_PROGRESS)\n\t\t\treturn false\n\t\t}\n\n\t\tif (!this.isPopping) {\n\t\t\tthis.popTarget = window.location.href\n\t\t}\n\n\t\tthis.isPopping = true\n\n\t\t// noinspection JSIgnoredPromiseFromCall\n\t\tthis.navigateTo(window.location.href, false, 'popstate')\n\t}\n\n\t/**\n\t * @private\n\t * @param {MouseEvent} e\n\t */\n\tonPrefetch = (e) => {\n\t\tconst target = processUrl(e.currentTarget.href)\n\n\t\tif (this.currentLocation.host !== target.host) {\n\t\t\treturn\n\t\t}\n\n\t\tthis.preload(e.currentTarget.href, false)\n\t}\n\n\t/**\n\t * @private\n\t * @param {string} url\n\t * @param {boolean} [runFallback]\n\t * @return {Promise}\n\t */\n\tfetch(url, runFallback = true) {\n\t\t// If Taxi is currently performing a fetch for the given URL, return that instead of starting a new request\n\t\tif (this.activePromises.has(url)) {\n\t\t\treturn this.activePromises.get(url)\n\t\t}\n\n\t\tconst request = new Promise((resolve, reject) => {\n\t\t\tfetch(url, {\n\t\t\t\tmode: 'same-origin',\n\t\t\t\tmethod: 'GET',\n\t\t\t\theaders: { 'X-Requested-With': 'Taxi' },\n\t\t\t\tcredentials: 'same-origin'\n\t\t\t})\n\t\t\t\t.then((response) => {\n\t\t\t\t\tif (!response.ok) {\n\t\t\t\t\t\treject('Taxi encountered a non 2xx HTTP status code')\n\n\t\t\t\t\t\tif (runFallback) {\n\t\t\t\t\t\t\twindow.location.href = url\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t\treturn response.text()\n\t\t\t\t})\n\t\t\t\t.then((htmlString) => {\n\t\t\t\t\tresolve(parseDom(htmlString))\n\t\t\t\t})\n\t\t\t\t.catch((err) => {\n\t\t\t\t\treject(err)\n\n\t\t\t\t\tif (runFallback) {\n\t\t\t\t\t\twindow.location.href = url\n\t\t\t\t\t}\n\t\t\t\t})\n\t\t\t\t.finally(() => {\n\t\t\t\t\tthis.activePromises.delete(url)\n\t\t\t\t})\n\t\t})\n\n\t\tthis.activePromises.set(url, request)\n\n\t\treturn request\n\t}\n\n\t/**\n\t * @private\n\t * @param {string|false} transition\n\t * @return {Transition|function}\n\t */\n\tchooseTransition(transition) {\n\t\tif (transition) {\n\t\t\treturn this.transitions[transition]\n\t\t}\n\n\t\tconst routeTransition = this.router?.findMatch(this.currentLocation, this.targetLocation)\n\n\t\tif (routeTransition) {\n\t\t\treturn this.transitions[routeTransition]\n\t\t}\n\n\t\treturn this.defaultTransition\n\t}\n\n\t/**\n\t * @private\n\t * @param {Document|Node} page\n\t * @return {CacheEntry}\n\t */\n\tcreateCacheEntry(page) {\n\t\tconst content = page.querySelector('[data-taxi-view]')\n\t\tconst Renderer = content.dataset.taxiView.length ? this.renderers[content.dataset.taxiView] : this.defaultRenderer\n\n\t\tif (!Renderer) {\n\t\t\tconsole.warn(`The Renderer \"${content.dataset.taxiView}\" was set in the data-taxi-view of the requested page, but not registered in Taxi.`)\n\t\t}\n\n\t\treturn {\n\t\t\tpage,\n\t\t\tcontent,\n\t\t\tskipCache: content.hasAttribute('data-taxi-nocache'),\n\t\t\tscripts: this.reloadJsFilter ? Array.from(page.querySelectorAll('script')).filter(this.reloadJsFilter) : [],\n\t\t\ttitle: page.title,\n\t\t\trenderer: new Renderer({\n\t\t\t\twrapper: this.wrapper,\n\t\t\t\ttitle: page.title,\n\t\t\t\tcontent,\n\t\t\t\tpage\n\t\t\t})\n\t\t}\n\t}\n}\n"],"names":["parser","DOMParser","processUrl","url","details","URL","window","location","origin","normalized","hash","length","replace","hasHash","pathname","host","raw","href","appendScript","node","parentNode","tagName","document","head","appendChild","duplicateScript","body","replacement","createElement","k","attributes","attr","setAttribute","nodeName","nodeValue","innerHTML","Transition","this","wrapper","leave","props","Promise","resolve","_this","onLeave","done","enter","_this2","onEnter","Renderer","page","title","_contentString","content","outerHTML","_DOM","lastElementChild","onEnterCompleted","onLeaveCompleted","initialLoad","update","firstElementChild","createDom","remove","transition","trigger","to","then","removeOldContent","from","RouteStore","data","Map","regexCache","add","fromPattern","toPattern","has","set","RegExp","get","findMatch","currentUrl","nextUrl","potentialMatches","match","IN_PROGRESS","Core","parameters","isTransitioning","currentCacheEntry","cache","activePromises","onClick","e","metaKey","ctrlKey","target","currentTarget","currentLocation","preventDefault","navigateTo","dataset","err","console","warn","onPopstate","isPopping","allowInterruption","popTarget","history","pushState","onPrefetch","preload","links","bypassCache","enablePrefetch","renderers","transitions","default","reloadJsFilter","element","undefined","taxiReload","defaultRenderer","defaultTransition","querySelector","attachEvents","createCacheEntry","cloneNode","renderer","setDefaultRenderer","setDefaultTransition","addRoute","router","preloadAssets","fetch","newPage","updateCache","key","clearCache","reject","_this3","targetLocation","navigationPromise","TransitionClass","chooseTransition","skipCache","fetched","beforeFetch","afterFetch","Error","on","event","callback","E","off","emit","_this4","entry","_this5","loadScripts","scripts","cachedScripts","newScripts","currentScripts","Array","querySelectorAll","filter","i","n","replaceChild","splice","delegate","runFallback","request","mode","method","headers","credentials","response","ok","text","htmlString","html","parseFromString","_this6","routeTransition","_this$router","taxiView","hasAttribute"],"mappings":"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"}